package main

import "fmt"

// 大写 public
type Stu struct {
	Name   string
	age    int
	Scores [5]float64
	ptr    *int
	slice  []int
	map1   map[string]string
}

func main() {
	var stu1 Stu
	fmt.Println(stu1)              // { 0 [0 0 0 0 0] <nil> [] map[]}
	fmt.Println(stu1.slice == nil) // true
	fmt.Println(stu1.map1 == nil)  // true

	// slice map 需要先make
	stu1.slice = make([]int, 10)
	stu1.slice[1] = 10
	fmt.Println(stu1) // { 0 [0 0 0 0 0] <nil> [0 10 0 0 0 0 0 0 0 0] map[]}
	stu1.map1 = make(map[string]string)
	stu1.map1["k1"] = "v1"
	fmt.Println(stu1) // { 0 [0 0 0 0 0] <nil> [0 10 0 0 0 0 0 0 0 0] map[k1:v1]}

	stu1.ptr = new(int)
	fmt.Println(stu1) // { 0 [0 0 0 0 0] 0x1180a0dc [0 10 0 0 0 0 0 0 0 0] map[k1:v1]}
	// 第二种方式
	fmt.Println("==========第二种方式===========")
	stu2 := Stu{}
	fmt.Println(stu2)

	stu3 := Stu{"zw",
		12,
		[5]float64{1},
		new(int),
		make([]int, 2),
		make(map[string]string)}
	fmt.Println(stu3) // {zw 12 [1 0 0 0 0] 0x1140a0e0 [0 0] map[]}
	fmt.Println("==========第3种方式 指针===========")
	//指针
	var stu4 *Stu = new(Stu)
	//(*stu4).Name="zw"
	//(*stu4).age=12
	// 和上面等价
	stu4.Name = "zw"
	stu4.age = 12
	fmt.Println(stu4) // &{zw 12 [0 0 0 0 0] <nil> [] map[]}

	fmt.Println("==========第4种方式 & ===========")
	var stu5 *Stu = &Stu{}
	//(*stu5).Name="zw"
	//(*stu5).age=12
	// 和上面等价
	stu5.Name = "zw"
	stu5.age = 12
	fmt.Println(stu5) //&{zw 12 [0 0 0 0 0] <nil> [] map[]}
}
